package com.test;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class DateSplitter {

    public static List<LocalDate> splitDateRange(LocalDate startDate, LocalDate endDate, int segments) {
        if (segments < 2) {
            throw new IllegalArgumentException("Segments must be greater than 1");
        }

        // 计算总天数
        long totalDays = ChronoUnit.DAYS.between(startDate, endDate) + 1; // 加1是因为包含结束日期

        // 计算每个分割段的天数，这里取整数部分，因此如果不能完全平均分配，最后一段可能会略长
        long daysPerSegment = Math.floorDiv(totalDays, segments);

        // 初始化结果列表
        List<LocalDate> splitDates = new ArrayList<>();

        // 添加第一个分割点
        splitDates.add(startDate);

        for (int i = 1; i < segments; i++) {
            // 计算当前分割段的结束日期
            LocalDate nextDate = startDate.plusDays(daysPerSegment * i);
            // 确保最后一个日期不超过endDate
            if (nextDate.isAfter(endDate)) {
                nextDate = endDate;
            }
            splitDates.add(nextDate);
        }

        return splitDates;
    }

    public static List<Date> splitDateRange(Date startDate, Date endDate, int segments) {
        if (segments < 2) {
            throw new IllegalArgumentException("Segments must be greater than 1");
        }

        // 计算总天数
        long totalDays = (endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24) + 1; // 加1是因为包含结束日期

        // 计算每个分割段的天数，这里取整数部分，因此如果不能完全平均分配，最后一段可能会略长
        long daysPerSegment = totalDays / segments;

        // 初始化结果列表
        List<Date> splitDates = new ArrayList<>();

        // 添加第一个分割点
        splitDates.add(startDate);

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(startDate);

        for (int i = 1; i < segments; i++) {
            // 计算当前分割段的结束日期
            calendar.add(Calendar.DAY_OF_YEAR, (int) daysPerSegment);
            Date nextDate = calendar.getTime();
            // 确保最后一个日期不超过endDate
            if (nextDate.after(endDate)) {
                nextDate = endDate;
            }
            splitDates.add(nextDate);
        }

        return splitDates;
    }

    public static void main(String[] args) {
        LocalDate startDate = LocalDate.of(2024, 7, 9);
        LocalDate endDate = LocalDate.of(2024, 7, 15);
        int segments = 2;

        List<LocalDate> resultDates = splitDateRange(startDate, endDate, segments);
        System.out.println("Split dates: " + resultDates);
    }
}